package uk.ac.jisc.depositmo.widgets;

/**
 * Copyright (c) 2011, University of Southampton
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, 
 * are permitted provided that the following conditions are met:
 * # Redistributions of source code must retain the above copyright notice, 
 *     this list of conditions and the following disclaimer.
 * # Redistributions in binary form must reproduce the above copyright notice, 
 *     this list of conditions and the following disclaimer in the documentation 
 *     and/or other materials provided with the distribution.
 * # Neither the name of the University of Southampton nor the names of its
 *     contributors may be used to endorse or promote products derived from this
 *     software without specific prior written permission.
 *  
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
 *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 
 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
 *  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 
 *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
 *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

import java.io.File;
import java.util.LinkedList;
import java.util.List;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Shell;

/**
 * 
 * @author Mark Borkum <mark.borkum@gmail.com>
 *
 */
public class FileDialog {
	public static boolean isValidFile(File file) {
		return file.exists() && file.canRead() && file.isFile();
	}
	
	private org.eclipse.swt.widgets.FileDialog fileDialog;
	
	public FileDialog(Shell parent) {
		org.eclipse.swt.widgets.FileDialog fileDialog = new org.eclipse.swt.widgets.FileDialog(parent, SWT.OPEN | SWT.MULTI);
		
		fileDialog.setFilterNames(new String[] { 
			"Documents (*.doc, *.docx, *.odt, *.pdf)",
			"Spreadsheets (*.xls, *.xlsx, *.ods)",
			"Presentations (*.ppt, *.pptx, *.odp)",
			"All Files (*.*)" 
		});
		
		fileDialog.setFilterExtensions(new String[] { 
			"*.doc;*.docx;*.odt;*.pdf", 
			"*.xls;*.xlsx;*.ods",
			"*.ppt;*.pptx;*.odp",
			"*.*" 
		});
		
		fileDialog.setText("Select file(s) to deposit...");
		
		this.setFileDialog(fileDialog);
	}
	
	private org.eclipse.swt.widgets.FileDialog getFileDialog() {
		return fileDialog;
	}

	private void setFileDialog(org.eclipse.swt.widgets.FileDialog fileDialog) {
		this.fileDialog = fileDialog;
	}
	
	public File[] open() {
		final org.eclipse.swt.widgets.FileDialog fileDialog = this.getFileDialog();
		
		if ((fileDialog == null) || (fileDialog.open() == null)) {
			return new File[0];
		} else {
			String filterPath = fileDialog.getFilterPath();
			String[] fileNames = fileDialog.getFileNames();
			
			String[] absolutePaths = new String[fileNames.length];
			
			for (int i = 0; i < fileNames.length; i++) {
				absolutePaths[i] = filterPath + File.separator + fileNames[i];
			}
			
			File[] files = new File[absolutePaths.length];
			
			for (int i = 0; i < absolutePaths.length; i++) {
				files[i] = new File(absolutePaths[i]);
			}
			
			return this.sanitizeFiles(files);
		}
	}
	
	private File[] sanitizeFiles(File[] files) {
		List<File> outputList = new LinkedList<File>();
		
		for (File file : files) {
			if (isValidFile(file)) {
				outputList.add(file);
			}
		}
		
		File[] outputArray = new File[outputList.size()];
		
		return outputList.toArray(outputArray);
	}
}
